package cn.tedu.justone.pack02;

/**
 * @作者：JustOne
 * @时间：2021/8/22 - 11:58
 */
public class Demo05_homework_01 {
    public static void main(String[] args) {

        //作业：
        // 碗里面有1000颗花生米，请创建两条线程girl和boy来吃花生米，吃一颗所用的时间为30毫秒
        // 1，双方一起吃，吃完为止，并在plate类中定义变量统计双方各吃了多少
        // 2，男生让女生先吃，吃到一半时男生才一起吃，吃完为止，在plate类中定义变量统计双方各吃了多少
        // 3，开始双方一起吃，当只剩下400颗时，男生让女生把剩下的吃完，在plate类中定义变量统计双方各吃了多少

        //
        //第一题：444,556  /  1000,0  /  52,948  / 239,761
        //第二题：788,212  /  656,344 /  1000,0  / 999,1
        //第二题：963,37   /  776,224 /  615,385 / 677,323
        Plate05 plate = new Plate05();

        Thread girl = new Thread(){
            @Override
            public void run() {
                while (plate.getMi()>0){
                    plate.eatMi();
                }
            }
        };

        Thread boy = new Thread(){
            @Override
            public void run() {
                /*
                //第一题
                while (plate.getMi()>0){
                    plate.eatMi();
                }
                */

                /*
                //第二题
                while (plate.getMi()>0){
                    if(plate.getMi()<500){
                        plate.eatMi();
                    }
                }
                */

                //第三题
                while(plate.getMi()>0){
                    plate.eatMi();
                    if(plate.getMi()<=400){
                        System.out.println("---girl.join()------");
                        try {
                            girl.join();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };

        girl.setName("女生");
        boy.setName("男生");

        girl.start();
        boy.start();

    }

}

//Plate，普累t，盘子
class Plate05 {
    private int mi = 1000;
    private int gCount = 0;
    private int bCount = 0;

    //synchronized被称为同步方法锁，
    // 加了synchronized的方法称为同步方法。同步方法的特点是，当一条线程执行该方法时，
    // 该方法会被上锁，别的方法只能等待。当别的线程执行完该方法时，才会释放(解除)这个锁
    public synchronized void eatMi() {
        if (mi>0) {
            mySleep(30);//这个休眠是为了增加出错机率，不要也可以
            String tName = Thread.currentThread().getName();
            if (tName.equals("女生")) {
                gCount++;
            } else {
                bCount++;
            }

            System.out.println(tName + "在吃第" + mi + "颗");
            mi--;
            if(mi==0){
                System.out.println("女生男生吃的颗数分别是："+gCount + "," + bCount);
            }
        }
    }

    public int getMi() {
        return mi;
    }
    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
